﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace MatrizCalculadora_XD
{
    public partial class Form1 : Form
    {
        TextBox[,] Matriz1;
        TextBox[,] Matriz2;
        Label[,] MatrizResultado;
        int tamanhoX = 50;
        int tamanhoY = 20;
        int linhaMatriz1 = 0;
        int colunaMatriz1 = 0;
        int linhaMatriz2 = 0;
        int colunaMatriz2 = 0;
        int linhaMatrizResultado = 0;
        int colunaMatrizResultado = 0;
        int total1 = 0;
        int total2 = 0;
        int total3 = 0;
        object obj;
        EventArgs evento;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            CheckMatriz1.Enabled = false;
            CheckMatriz2.Enabled = false;
            GroupMatriz1.Controls.Add(PanelMatriz1);
            GroupMatriz2.Controls.Add(PanelMatriz2);
            GroupResultado.Controls.Add(PanelResultado);
            Oposta.Enabled = false;
            Transposta.Enabled = false;
            Inversa.Enabled = false;
        }

        private void ButtonCreatMatriz1_Click(object sender, EventArgs e)
        {
            if ((Matriz1Linha.Text.Equals("2") && Matriz1Coluna.Text.Equals("2")) ||
                (Matriz1Linha.Text.Equals("3") && Matriz1Coluna.Text.Equals("3")))
            {
                Oposta.Enabled = true;
                Transposta.Enabled = true;
                Inversa.Enabled = false;
                CheckMatriz1.Enabled = true;
                //CheckMatriz2.Enabled = true;
                GroupMatriz1.Enabled = true;
                GroupMatriz2.Enabled = true;
                Determinante.Enabled = true;
                
            }
            else if ((!Matriz1Linha.Text.Equals("2") && !Matriz1Coluna.Text.Equals("2")) ||
                (!Matriz1Linha.Text.Equals("3") && !Matriz1Coluna.Text.Equals("3")) ||
                (!Matriz2Linha.Text.Equals("2") && !Matriz2Coluna.Text.Equals("2")) ||
                (!Matriz2Coluna.Text.Equals("3") && !Matriz2Linha.Text.Equals("3")))
            {
                Oposta.Enabled = false;
                Transposta.Enabled = false;
                Inversa.Enabled = false;
                CheckMatriz1.Enabled = false;
                //CheckMatriz2.Enabled = false;
                Determinante.Enabled = false;
                GroupMatriz1.Enabled = true;
                GroupMatriz2.Enabled = true;
            }
            PanelResultado.Controls.Clear();
            PanelMatriz1.Controls.Clear();

            linhaMatriz1 = int.Parse(Matriz1Linha.Text);
            colunaMatriz1 = int.Parse(Matriz1Coluna.Text);
            if (linhaMatriz1 > 30 || colunaMatriz1 > 30 || linhaMatriz2 > 30 || colunaMatriz2 > 30)
            {
              DialogResult result =  MessageBox.Show("Você acha que seu computador suporta a criação de uma matriz tão grande?","Atenção cliente:",MessageBoxButtons.YesNo);
                if(result == DialogResult.No)
                {
                    linhaMatriz1 = 0;
                    colunaMatriz1 = 0;
                    Matriz1Linha.Text = "";
                    Matriz1Coluna.Text = "";
                }
            }
            if(linhaMatriz1 > 0 && colunaMatriz1 > 0)
            {
                Matriz1 = new TextBox[colunaMatriz1, linhaMatriz1];
                for (int c = 0; c < colunaMatriz1; c++ )
                {
                    for (int l = 0; l < linhaMatriz1; l++)
                    {
                        Matriz1[c, l] = new TextBox();
                        Matriz1[c, l].Location = new Point(c*tamanhoX,l*tamanhoY);
                        Matriz1[c, l].Size = new Size(tamanhoX,tamanhoY);
                        Matriz1[c, l].Text = "0";
                        Matriz1[c, l].TabIndex++;
                        PanelMatriz1.Controls.Add(Matriz1[c, l]);
                        total1++;
                    }
                }
            }
        }

        private void ButtonCreatMatriz2_Click(object sender, EventArgs e)
        {
            if (( Matriz2Linha.Text.Equals("2")  && Matriz2Coluna.Text.Equals("2")) ||
                (Matriz2Coluna.Text.Equals("3") && Matriz2Linha.Text.Equals("3")))
            {
                Oposta.Enabled = true;
                Transposta.Enabled = true;
                Inversa.Enabled = false;
                //CheckMatriz1.Enabled = true;
                CheckMatriz2.Enabled = true;
                GroupMatriz1.Enabled = true;
                GroupMatriz2.Enabled = true;
                Determinante.Enabled = true;
            }
            else if ((!Matriz1Linha.Text.Equals("2") && !Matriz1Coluna.Text.Equals("2")) ||
                (!Matriz1Linha.Text.Equals("3") && !Matriz1Coluna.Text.Equals("3")) ||
                (!Matriz2Linha.Text.Equals("2") && !Matriz2Coluna.Text.Equals("2")) ||
                (!Matriz2Coluna.Text.Equals("3") && !Matriz2Linha.Text.Equals("3")))
            {
                Oposta.Enabled = false;
                Transposta.Enabled = false;
                Inversa.Enabled = false;
                //CheckMatriz1.Enabled = false;
                CheckMatriz2.Enabled = false;
                Determinante.Enabled = false;
                GroupMatriz1.Enabled = true;
                GroupMatriz2.Enabled = true;
            }

            PanelResultado.Controls.Clear();
            PanelMatriz2.Controls.Clear();

            linhaMatriz2 = int.Parse(Matriz2Linha.Text);
            colunaMatriz2 = int.Parse(Matriz2Coluna.Text);

            if (linhaMatriz1 > 30 || colunaMatriz1 > 30 || linhaMatriz2 > 30 || colunaMatriz2 > 30)
            {
                DialogResult result = MessageBox.Show("Você acha que seu computador suporta a de uma matriz tão grande?", "Atenção cliente:", MessageBoxButtons.YesNo);
                if (result == DialogResult.No)
                {
                    linhaMatriz2 = 0;
                    colunaMatriz2 = 0;
                    Matriz2Linha.Text = "";
                    Matriz2Coluna.Text = "";
                }
            }
            if(linhaMatriz2 > 0 && colunaMatriz2 > 0)
            {
                Matriz2 = new TextBox[colunaMatriz2, linhaMatriz2];
                for (int c = 0; c < colunaMatriz2; c++ )
                {
                    for (int l = 0; l < linhaMatriz2; l++)
                    {
                        Matriz2[c, l] = new TextBox();
                        Matriz2[c, l].Location = new Point(c*tamanhoX,l*tamanhoY);
                        Matriz2[c,l].Size = new Size(tamanhoX,tamanhoY);
                        Matriz2[c, l].Text = "0";
                        Matriz2[c, l].TabIndex++;
                        PanelMatriz2.Controls.Add(Matriz2[c, l]);
                        total2++;
                    }
                }
            }
        }

        private void Soma_Click(object sender, EventArgs e)
        {
            if (Matriz1Linha.Text.Equals("") || Matriz2Linha.Text.Equals("") || Matriz1Coluna.Text.Equals("") || Matriz2Coluna.Text.Equals(""))
            {
                MessageBox.Show("As matriz devem ser criadas primeiro");
            }
            else
            {
                if (linhaMatriz1 == linhaMatriz2 && colunaMatriz1 == colunaMatriz2)
                {
                    PanelResultado.Controls.Clear();

                    linhaMatrizResultado = linhaMatriz1;
                    colunaMatrizResultado = colunaMatriz1;
                    MatrizResultado = new Label[linhaMatriz1, colunaMatriz1];
                    for (int c = 0; c < colunaMatriz1; c++)
                    {
                        for (int l = 0; l < linhaMatriz1; l++)
                        {
                            MatrizResultado[c, l] = new Label();
                            MatrizResultado[c, l].Location = new Point(c * tamanhoX, l * tamanhoY);
                            MatrizResultado[c, l].Size = new Size(tamanhoX, tamanhoY);
                            MatrizResultado[c, l].Font = new Font(FontFamily.GenericSansSerif, 10f);
                            MatrizResultado[c, l].Text = "" + (double.Parse(Matriz1[c, l].Text) + double.Parse(Matriz2[c, l].Text));
                            total3++;
                            PanelResultado.Controls.Add(MatrizResultado[c, l]);
                        }
                    }
                }
                else
                {
                    MessageBox.Show("As matrizes devem ser de mesma ordem");
                }
            }
        }

        private void Subtração_Click(object sender, EventArgs e)
        {
            if (Matriz1Linha.Text.Equals("") || Matriz2Linha.Text.Equals("") || Matriz1Coluna.Text.Equals("") || Matriz2Coluna.Text.Equals(""))
            {
                MessageBox.Show("As matriz devem ser criadas primeiro");
            }
            else
            {
                PanelResultado.Controls.Clear();

                if (linhaMatriz1 == linhaMatriz2 && colunaMatriz1 == colunaMatriz2)
                {
                    MatrizResultado = new Label[linhaMatriz1, colunaMatriz1];
                    for (int c = 0; c < colunaMatriz1; c++)
                    {
                        for (int l = 0; l < linhaMatriz1; l++)
                        {
                            MatrizResultado[c, l] = new Label();
                            MatrizResultado[c, l].Location = new Point(c * tamanhoX, l * tamanhoY);
                            MatrizResultado[c, l].Size = new Size(tamanhoX, tamanhoY);
                            MatrizResultado[c, l].Font = new Font(FontFamily.GenericSansSerif, 10f);
                            MatrizResultado[c, l].Text = "" + (double.Parse(Matriz1[c, l].Text) - double.Parse(Matriz2[c, l].Text));
                            total3++;
                            PanelResultado.Controls.Add(MatrizResultado[c, l]);
                        }
                    }
                }
                else
                {
                    MessageBox.Show("As matrizes devem ser de mesma ordem");
                }
            }
        }

        private void Multiplicacao_Click(object sender, EventArgs e)
        {
            if (Matriz1Linha.Text.Equals("") || Matriz2Linha.Text.Equals("") || Matriz1Coluna.Text.Equals("") || Matriz2Coluna.Text.Equals(""))
            {
                MessageBox.Show("As matriz devem ser criadas primeiro");
            }
            else
            {
                PanelResultado.Controls.Clear();

                if (linhaMatriz1 == colunaMatriz2)
                {
                    if (colunaMatriz1 == linhaMatriz2)
                    {
                        MatrizResultado = new Label[linhaMatriz1, colunaMatriz2];
                        MatrizResultado = MultiplicarMatrizes(Matriz1, Matriz2);
                        for (int i = 0; i < MatrizResultado.GetLength(0); i++)
                        {
                            for (int j = 0; j < MatrizResultado.GetLength(1); j++)
                            {
                                PanelResultado.Controls.Add(MatrizResultado[i, j]);
                                total3++;
                            }
                        }
                    }
                    else
                    {
                        MessageBox.Show("Não foi possivel, a coluna de uma matriz tem que ser igual a de linhas da outra");
                    }
                }
                else
                {
                    MessageBox.Show("Não foi possivel, a coluna de uma matriz tem que ser igual a de linhas da outra");
                }
            }
        }

        private void Oposta_Click(object sender, EventArgs e)
        {
            if (CheckMatriz1.Checked == false && CheckMatriz2.Checked == false)
            {
                MessageBox.Show("Escolha uma das matrizes");
            }
            else
            {
                if(CheckMatriz1.Checked == true && CheckMatriz2.Checked == true)
                {
                    MessageBox.Show("Não é possivel usar as duas matrizes");
                    CheckMatriz1.Checked = false;
                    CheckMatriz2.Checked = false;
                }
                if (CheckMatriz1.Checked == true && CheckMatriz2.Checked == false)
                {

                    GroupMatriz1.Enabled = true;
                    GroupMatriz2.Enabled = false;

                    Label[,] MatrizResultado = new Label[colunaMatriz1, linhaMatriz1];

                    PanelResultado.Controls.Clear();


                    for (int c = 0; c < colunaMatriz1; c++)
                    {
                        for (int l = 0; l < linhaMatriz1; l++)
                        {
                            MatrizResultado[c, l] = new Label();
                            MatrizResultado[c, l].Location = new Point(c * tamanhoX, l * tamanhoY);
                            MatrizResultado[c, l].Size = new Size(tamanhoX, tamanhoY);
                            MatrizResultado[c, l].Text = "" + (int.Parse(Matriz1[c, l].Text) * -1);
                            PanelResultado.Controls.Add(MatrizResultado[c, l]);
                            total3++;
                        }
                    }

                }
                if (CheckMatriz1.Checked == false && CheckMatriz2.Checked == true)
                {
                    GroupMatriz2.Enabled = true;
                    GroupMatriz1.Enabled = false;
                    Label[,] MatrizResultado = new Label[colunaMatriz2, linhaMatriz2];
                    if(total3 > 0)
                    {
                        for (int c = 0; c < MatrizResultado.GetLength(0); c++)
                        {
                            for (int l = 0; l < MatrizResultado.GetLength(1); l++)
                            {
                                PanelResultado.Controls.Remove(MatrizResultado[c, l]);
                                total3--;
                            }
                        }
                    }
                    for (int c = 0; c < colunaMatriz2; c++)
                    {
                        for (int l = 0; l < linhaMatriz2; l++)
                        {
                            MatrizResultado[c, l] = new Label();
                            MatrizResultado[c, l].Location = new Point(c* tamanhoX, l * tamanhoY);
                            MatrizResultado[c, l].Size = new Size(tamanhoX, tamanhoY);
                            MatrizResultado[c, l].Text = "" + (int.Parse(Matriz2[c, l].Text) * -1);
                            PanelResultado.Controls.Add(MatrizResultado[c, l]);
                            total3++;
                        }
                    }
                }
            }
        }

        public Label[,] MultiplicarMatrizes(TextBox[,] a, TextBox[,] b)
        {
            Label[,] C = new Label[a.GetLength(0), b.GetLongLength(1)];
            int[,] result = new int[a.GetLength(0), b.GetLongLength(1)];
            for(int i = 0; i < a.GetLength(0); i++)
            {
                for(int j = 0; j < b.GetLength(1); j++)
                {
                    for (int k = 0; k < b.GetLength(0); k++)
                    {
                        int matriz1 = int.Parse(a[i, k].Text);
                        int matriz2 = int.Parse(b[k, j].Text);

                        result[i,j] += (matriz1 * matriz2);

                        C[i, j] = new Label();
                        C[i, j].Location = new Point(i* tamanhoX, j*tamanhoY);
                        C[i, j].Size = new Size(tamanhoX,tamanhoY);
                        C[i, j].Text = "" + result[i, j];
                    }
                }
            }
            return C;
        }

        private void Transposta_Click(object sender, EventArgs e)
        {
            if (CheckMatriz1.Checked == false && CheckMatriz2.Checked == false)
            {
                MessageBox.Show("Escolha uma das matrizes");
            }
            else
            {
                if (CheckMatriz1.Checked == true && CheckMatriz2.Checked == true)
                {
                    MessageBox.Show("Não é possivel usar as duas matrizes");
                    CheckMatriz1.Checked = false;
                    CheckMatriz2.Checked = false;
                }
                if (CheckMatriz1.Checked == true && CheckMatriz2.Checked == false)
                {

                    GroupMatriz1.Enabled = true;
                    GroupMatriz2.Enabled = false;

                    Label[,] MatrizResultado = new Label[linhaMatriz1,colunaMatriz1];
                    
                    PanelResultado.Controls.Clear();

                    for (int c = 0; c < colunaMatriz1; c++)
                    {
                        for (int l = 0; l < linhaMatriz1; l++)
                        {
                            MatrizResultado[l, c] = new Label();
                            MatrizResultado[l, c].Location = new Point(l * tamanhoX, c * tamanhoY);
                            MatrizResultado[l, c].Size = new Size(tamanhoX, tamanhoY);
                            MatrizResultado[l, c].Text = "" + (int.Parse(Matriz1[c, l].Text));
                            PanelResultado.Controls.Add(MatrizResultado[l, c]);
                            total3++;
                        }
                    }
                }
                if (CheckMatriz1.Checked == false && CheckMatriz2.Checked == true)
                {
                    GroupMatriz2.Enabled = true;
                    GroupMatriz1.Enabled = false;
                    Label[,] MatrizResultado = new Label[linhaMatriz2,colunaMatriz2];
                    if (total3 > 0)
                    {
                        for (int c = 0; c < MatrizResultado.GetLength(0); c++)
                        {
                            for (int l = 0; l < MatrizResultado.GetLength(1); l++)
                            {
                                PanelResultado.Controls.Remove(MatrizResultado[c, l]);
                                total3--;
                            }
                        }
                    }
                    for (int c = 0; c < colunaMatriz2; c++)
                    {
                        for (int l = 0; l < linhaMatriz2; l++)
                        {
                            MatrizResultado[l, c] = new Label();
                            MatrizResultado[l, c].Location = new Point(l * tamanhoX, c * tamanhoY);
                            MatrizResultado[l, c].Size = new Size(tamanhoX, tamanhoY);
                            MatrizResultado[l, c].Text = "" + (int.Parse(Matriz2[c,l].Text) * -1);
                            PanelResultado.Controls.Add(MatrizResultado[l, c]);
                        }
                    }
                }
            }
        }

        private void Determinante_Click(object sender, EventArgs e)
        {
            int determinante = 0;
            if (CheckMatriz1.Checked == true || CheckMatriz2.Checked == true)
            {
                if (CheckMatriz1.Checked == true && CheckMatriz2.Checked == true)
                {
                    MessageBox.Show("Selecione uma matriz!", "Atenção: ");
                }
                if (CheckMatriz1.Checked == true && CheckMatriz2.Checked == false)
                {
                    if (Matriz1.GetLength(0) == 3 && Matriz1.GetLength(1) == 3)
                    {
                        int d1 = int.Parse(Matriz1[0, 0].Text) * int.Parse(Matriz1[1, 1].Text) * int.Parse(Matriz1[2, 2].Text);
                        int d2 = int.Parse(Matriz1[0, 1].Text) * int.Parse(Matriz1[1, 2].Text) * int.Parse(Matriz1[2, 0].Text);
                        int d3 = int.Parse(Matriz1[1, 0].Text) * int.Parse(Matriz1[2, 1].Text) * int.Parse(Matriz1[0, 2].Text);

                        int d4 = int.Parse(Matriz1[0, 2].Text) * int.Parse(Matriz1[1, 1].Text) * int.Parse(Matriz1[2, 0].Text);
                        int d5 = int.Parse(Matriz1[0, 1].Text) * int.Parse(Matriz1[1, 0].Text) * int.Parse(Matriz1[2, 2].Text);
                        int d6 = int.Parse(Matriz1[0, 0].Text) * int.Parse(Matriz1[1, 2].Text) * int.Parse(Matriz1[2, 1].Text);

                        determinante = (d1 + d2 + d3) - (d4 + d5 + d6);
                        


                        MessageBox.Show("A determinante da matriz 1 é igual a: " + determinante, "Determinante resultado: ");
                    }
                    if (Matriz1.GetLength(0) == 2 && Matriz1.GetLength(1) == 2)
                    {
                        int d1 = int.Parse(Matriz1[0, 0].Text) * int.Parse(Matriz1[1, 1].Text);
                        int d2 = int.Parse(Matriz1[0, 1].Text) * int.Parse(Matriz1[1, 0].Text);

                        determinante = (d1 - d2);

                        MessageBox.Show("A determinante da matriz 2 é igual a: " + determinante, "Determinante resultado: ");
                    }
                }
                if (CheckMatriz1.Checked == false && CheckMatriz2.Checked == true)
                {
                    if (Matriz2.GetLength(0) == 3 && Matriz2.GetLength(1) == 3)
                    {
                        int d1 = int.Parse(Matriz2[0, 0].Text) * int.Parse(Matriz2[1, 1].Text) * int.Parse(Matriz2[2, 2].Text);
                        int d2 = int.Parse(Matriz2[0, 1].Text) * int.Parse(Matriz2[1, 2].Text) * int.Parse(Matriz2[2, 0].Text);
                        int d3 = int.Parse(Matriz2[1, 0].Text) * int.Parse(Matriz2[2, 1].Text) * int.Parse(Matriz2[0, 2].Text);

                        int d4 = int.Parse(Matriz2[0, 2].Text) * int.Parse(Matriz2[1, 1].Text) * int.Parse(Matriz2[2, 0].Text);
                        int d5 = int.Parse(Matriz2[0, 1].Text) * int.Parse(Matriz2[1, 0].Text) * int.Parse(Matriz2[2, 2].Text);
                        int d6 = int.Parse(Matriz2[0, 0].Text) * int.Parse(Matriz2[1, 2].Text) * int.Parse(Matriz2[2, 1].Text);

                        determinante = (d1 + d2 + d3) - (d4 + d5 + d6);

                        MessageBox.Show("A determinante da matriz 2 é igual a: " + determinante, "Determinante resultado: ");
                    }
                    if (Matriz1.GetLength(0) == 2 && Matriz1.GetLength(1) == 2)
                    {
                        int d1 = int.Parse(Matriz2[0, 0].Text) * int.Parse(Matriz2[1, 1].Text);
                        int d2 = int.Parse(Matriz2[0, 1].Text) * int.Parse(Matriz2[1, 0].Text);

                        determinante = (d1 - d2);

                        MessageBox.Show("A determinante da matriz 2 é igual a: " + determinante, "Determinante resultado: ");
                    }
                }
            }
            else
            {
              
                if (CheckMatriz1.Checked == false && CheckMatriz2.Checked == false)
                {
                    MessageBox.Show("Selecione somente uma matriz!", "Atenção: ");
                }
            }
        }

        private void Inversa_Click(object sender, EventArgs e)
        {
            //if (CheckMatriz1.Checked == true && CheckMatriz2.Checked == false)
            //{
            //    int n = Matriz1.Length;

            //}
            //if (CheckMatriz1.Checked == false && CheckMatriz2.Checked == true)
            //{
            //    int n = Matriz2.Length;
            //}
        }

        private void LimparMatriz2_Click(object sender, EventArgs e)
        {
            PanelMatriz2.Controls.Clear(); 
            Matriz2Coluna.Text = "";
            Matriz2Linha.Text = "";
        }

        private void LimparMatriz1_Click(object sender, EventArgs e)
        {
            PanelMatriz1.Controls.Clear(); 
            Matriz1Coluna.Text = "";
            Matriz1Linha.Text = "";
        }

        private void LimparMatrizResultado_Click(object sender, EventArgs e)
        {
            PanelResultado.Controls.Clear();
        }

        private void Matriz1Linha_TextChanged(object sender, EventArgs e)
        {

        }
    }
}
